use encoding_rs::GBK;
use serde::Deserialize;
use std::process::Command;

/// 定义Task结构体，映射tasklist CSV输出的字段
#[derive(Debug, Deserialize)]
struct Task {
    #[serde(rename = "映像名称")] // 匹配CSV标题的"映像名称"列
    image_name: String,
    #[serde(rename = "PID")]
    pid: u32,                  // 进程ID（无符号32位整数）
    #[serde(rename = "会话名")]
    session_name: String,      // 会话名称（如"Services"）
    #[serde(rename = "会话#")]
    session_number: u32,       // 会话编号（无符号32位整数）
    #[serde(rename = "内存使用")]
    memory_usage: String,      // 内存使用情况（如"8 K"）
}

pub fn oneFn() -> Result<(), Box<dyn std::error::Error>> {
    println!("我执行了");
    // 执行tasklist命令，输出CSV格式
    let output = Command::new("tasklist")
        .arg("/fo")   // 指定输出格式
        .arg("csv")   // CSV格式
        .output()?;   // 执行并获取输出

    // 检查命令是否成功执行（状态码为0表示成功）
    if !output.status.success() {
        return Err(format!(
            "tasklist执行失败，状态码：{}",
            output.status.code().unwrap_or(0)
        ).into());
    }

    // 转换编码：GBK（Windows cmd默认）→ UTF-8
    let (decoded_str, _, had_errors) = GBK.decode(&output.stdout);
    if had_errors {
        eprintln!("警告：部分字符无法从GBK解码为UTF-8");
    }
    let output_str = decoded_str;

    // 使用csv crate解析CSV数据
    let mut csv_reader = csv::ReaderBuilder::new()
        .from_reader(output_str.as_bytes()); // 从字节流创建CSV读取器

    // 遍历每一行记录并反序列化为Task对象
    for result in csv_reader.deserialize() {
        let task: Task = result?; // 反序列化成功则得到Task实例
        println!("进程信息：{:?}", task);
    }

    Ok(csv_reader)
}